# ========= 导入基础模块 ============
from resources_base.module_base.importbase import *
from resources_base.module_base.basetools import md5
# ========= 导入数据的类 ============
from userweb.models import Account, Permission, Roles


def index(request):
    """返回页面"""
    return render(request, 'user/login.html')


def login_handle(request):
    """用户登陆【要求：各种错误必须要明确展示给用户】"""

    """
    一。 各种验证场景的描述
    完成身份验证： -- 0
    错误01：账号不存在   -- 1
    错误02：密码错误    -- 2
    错误03：账号已禁用  -- 3
    错误04：未知的错误，展示系统返回的错误信息  --4 
    
    二。 登陆的时候，账号可以是： loginid, email, mobile 
    """
    # 接收前端传递的信息
    loginid = request.POST.get('loginid')
    loginpwd = request.POST.get('loginpwd')
    # 获取记住我的值
    remember = request.POST.get('rememberme', "")
    # 异常处理
    try:
        # ======== 1. 身份验证 ================
        # 根据输入的登陆获取account
        account_obj = Account.objects.filter(Q(loginid=loginid) | Q(email=loginid) | Q(mobile=loginid)).first()
        # 判断是否存在
        if not account_obj:
            return JsonResponse({'code': 1, 'error': '登陆账号不存在， 请联系管理员！'})

        # 如果账号存在，判断是否禁用
        if not account_obj.status:
            return JsonResponse({'code': 2, 'error': '账号已禁用，  请联系管理员！'})

        # 判断密码是否正确
        if account_obj.loginpwd != md5(loginpwd):
            return JsonResponse({'code': 3, 'error': '密码错误！'})

        # =========2. 身份验证成功，把当前时间写入上次登陆时间 ===================
        account_obj.last_login = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        account_obj.save()
        # ========3. 把个人的数据存储在Session中 ========
        account_dict = {
            'loginid': account_obj.loginid, 'name': account_obj.name,
            'department': account_obj.department, 'position': account_obj.position,
            'mobile': account_obj.mobile, 'email': account_obj.email, 'create_time':account_obj.create_time.strftime("%Y-%m-%d %H:%M:%S"),
            'last_login':  datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }
        # 判断是否有修改时间
        if account_obj.edit_time:
            account_dict['edit_time'] = account_obj.edit_time.strftime("%Y-%m-%d %H:%M:%S")
        else:
            account_dict['edit_time']= "尚未修改"

        # 获取当前的角色信息
        account_roles = list(Roles.objects.filter(account__loginid=account_dict.get('loginid')).order_by('id').values_list('name',
                                                                                                        flat=True))
        # 添加到当前用户用
        account_dict['roles'] = ",".join(account_roles)

        # 判断是否需要写入到session中
        if remember == 'on':
            request.session['user'] = account_dict
            # ==== 获取当前用户的权限列表 ======
            # permission_urls = [.....]
            request.session.set_expiry(14 * 24 * 3600)
        else:
            request.session['user'] = account_dict
            request.session.set_expiry(30 * 3600)

        # =========4. 获取当前用户具备哪些权限 ===============
        permission_queryset = list(Permission.objects.filter(roles__account__loginid=account_dict.get('loginid')).values('id',
                            'title', 'url', 'order', 'menu_id', 'menu__title', 'menu__order','menu__icon').order_by('order').distinct())

        # 获取当前用户权限的URL
        permission_list = []
        # 遍历permission_queryset集合，获取url
        for item in permission_queryset:
            permission_list.append(item.get('url'))

        # 把AUTHED_WHITE_URL 添加
        permission_list.extend(settings.AUTHED_WHITE_URL)
        # 是否具备培训基础信息的权限
        if '/basic/info/' in permission_list:
            permission_list.extend(settings.TRAINS_BASIC_INFO_URL)


        # 定义菜单的最终存储的结构
        menu_dict = {}
        # 生成menu_dict的数据结构
        for item in permission_queryset:
            # 获取当前的menu_id
            menu_id = item.get('menu_id')
            # 判断menu_Id 是否存在
            if not menu_id: continue
            # 判断当前的menu是否在menu_dict中存在
            if menu_id not in menu_dict:
                # 重新产生一个
                menu_dict[menu_id] = {
                    'title': item.get('menu__title'),
                    'icon': item.get('menu__icon'),
                    'order': item.get('menu__order'),
                    'children': [
                        {
                            'title': item.get('title'),
                            'url': item.get('url'),
                            'order': item.get('order')
                        }
                    ]
                }
            else:
                menu_dict[menu_id]['children'].append({ 'title': item.get('title'),'url': item.get('url'), 'order': item.get('order')})


        print(permission_list)
        print(menu_dict)
        # 把当前用户的权限列表写入到session
        request.session['permission_list'] = permission_list
        # 把当前用户的菜单数据写入到session
        request.session['menu_dict'] = menu_dict
        # =========5. 返回当前成功登陆 =====
        return JsonResponse({'code': 0 })

    except Exception as e:
        return JsonResponse({'code': 4, 'error': '身份验证出现异常，具体原因：' + str(e)})
